package be.ipl.finito.domaine;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;

import be.ipl.finito.exceptions.ArgumentInvalideException;
import be.ipl.finito.util.Util;

@Entity
@Table(name="JOUEURS",schema="FINITO")
@SuppressWarnings("serial")
public class Joueur implements Serializable{
	/**
	 * Entier(id) unique pour chaque Joueur
	 */
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private int id;
	
	/**
	 * login du joueur
	 */
	@NotNull
	@Column(unique = true)
	private String login;
	
	/**
	 * Mot de passe du compte joueur
	 */
	@Column
	@NotNull
	private String motDePasse;
	
	@Column
	@NotNull
	private String nom;
	
	@Column
	@NotNull
	private String prenom;

	@Column
	@NotNull
	private String email;
	
	/**
	 * Les parties du joueur
	 */
	@OneToMany(mappedBy="joueur")
	private List<Plateau> lesPlateaux;

	
	protected Joueur(){
		
	}

	/**
	 * Constructeur d'un joueur
	 * 
	 * @param login
	 *            le login voulu par le joueur
	 * @param motDePasse
	 *            le mot de passe du joueur
	 * @param nom
	 *            le nom du joueur
	 * @param prenom
	 *            le prenom du joueur
	 * @param email
	 *            l'email du joueur
	 * @throws ArgumentInvalideException
	 */
	public Joueur(String login, String motDePasse, String nom, String prenom,
			String email) throws IllegalArgumentException{
		Util.checkString(login);
		Util.checkString(motDePasse);
		Util.checkString(nom);
		Util.checkString(prenom);
		Util.checkString(email);
		this.login = login;
		this.motDePasse = motDePasse;
		this.nom = nom;
		this.prenom = prenom;
		this.email = email;
		this.lesPlateaux = new ArrayList<Plateau>();
	}


	public int getId() {
		return id;
	}


	public String getLogin() {
		return login;
	}


	public String getMotDePasse() {
		return motDePasse;
	}


	public String getNom() {
		return nom;
	}


	public String getPrenom() {
		return prenom;
	}


	public String getEmail() {
		return email;
	}
	
	

	public List<Plateau> getLesPlateaux() {
		return lesPlateaux;
	}

	public void setLesPlateaux(List<Plateau> lesPlateaux) {
		Util.checkObject(lesPlateaux);
		this.lesPlateaux = lesPlateaux;
	}

	public void setLogin(String login) {
		Util.checkString(login);
		this.login = login;
	}

	public void setMotDePasse(String motDePasse) {
		Util.checkString(motDePasse);
		this.motDePasse = motDePasse;
	}

	public void setNom(String nom) {
		Util.checkString(nom);
		this.nom = nom;
	}

	public void setPrenom(String prenom) {
		Util.checkString(prenom);
		this.prenom = prenom;
	}

	public void setEmail(String email) {
		Util.checkString(email);
		this.email = email;
	}
	
	public boolean authentifier(String motDePasse){
		return this.motDePasse.equals(motDePasse);
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + id;
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Joueur other = (Joueur) obj;
		if (id != other.id)
			return false;
		return true;
	}
	
	
	
	
}
